package com.example.demo.util;

import com.example.demo.dto.OperatorDto;
import com.example.demo.dto.OrderFieldDto;

import java.util.ArrayList;
import java.util.Collection;
import java.util.List;

/**
 * @author caitao
 * @date 2022/2/23 3:30 下午
 * @Description
 */
public class QueryWrapper {

    private List<String> fields = new ArrayList<>();
    private List<OperatorDto> operators = new ArrayList<>();
    private List<OrderFieldDto> orderFields = new ArrayList<>();

    public QueryWrapper queryColumns(List<String> columns){
        this.fields = columns;
        return this;
    }

    public QueryWrapper eq(String column,Object val){
        OperatorDto operatorDto = new OperatorDto();
        operatorDto.setColumnName(column);
        operatorDto.setOperator("=");
        operatorDto.setValue(val);
        this.operators.add(operatorDto);
        return this;
    }

    public QueryWrapper ne(String column,Object val){
        OperatorDto operatorDto = new OperatorDto();
        operatorDto.setColumnName(column);
        operatorDto.setOperator("<>");
        operatorDto.setValue(val);
        this.operators.add(operatorDto);
        return this;
    }

    public QueryWrapper likeLeft(String column,Object val){
        OperatorDto operatorDto = new OperatorDto();
        operatorDto.setColumnName(column);
        operatorDto.setOperator("like");
        operatorDto.setValue(val+"%");
        this.operators.add(operatorDto);
        return this;
    }

    public QueryWrapper likeRight(String column,Object val){
        OperatorDto operatorDto = new OperatorDto();
        operatorDto.setColumnName(column);
        operatorDto.setOperator("like");
        operatorDto.setValue("%"+val);
        this.operators.add(operatorDto);
        return this;
    }

    public QueryWrapper in(String column, Collection<?> coll){
        OperatorDto operatorDto = new OperatorDto();
        operatorDto.setColumnName(column);
        operatorDto.setOperator("in");
        operatorDto.setValue(coll);
        this.operators.add(operatorDto);
        return this;
    }

    public QueryWrapper between(String column, Object val, Object val2){
        OperatorDto operatorDto = new OperatorDto();
        operatorDto.setColumnName(column);
        operatorDto.setOperator("between");
        operatorDto.setValue(val);
        operatorDto.setValue2(val2);
        this.operators.add(operatorDto);
        return this;
    }

    public QueryWrapper isNULL(String column,Object val){
        OperatorDto operatorDto = new OperatorDto();
        operatorDto.setColumnName(column);
        operatorDto.setOperator("is");
        this.operators.add(operatorDto);
        return this;
    }

    public QueryWrapper gt(String column, Object val){
        OperatorDto operatorDto = new OperatorDto();
        operatorDto.setColumnName(column);
        operatorDto.setOperator(">");
        operatorDto.setValue(val);
        this.operators.add(operatorDto);
        return this;
    }

    public QueryWrapper lt(String column, Object val){
        OperatorDto operatorDto = new OperatorDto();
        operatorDto.setColumnName(column);
        operatorDto.setOperator("<");
        operatorDto.setValue(val);
        this.operators.add(operatorDto);
        return this;
    }

    public QueryWrapper ge(String column, Object val){
        OperatorDto operatorDto = new OperatorDto();
        operatorDto.setColumnName(column);
        operatorDto.setOperator(">=");
        operatorDto.setValue(val);
        this.operators.add(operatorDto);
        return this;
    }

    public QueryWrapper le(String column, Object val){
        OperatorDto operatorDto = new OperatorDto();
        operatorDto.setColumnName(column);
        operatorDto.setOperator("<=");
        operatorDto.setValue(val);
        this.operators.add(operatorDto);
        return this;
    }

    public QueryWrapper orderByAsc(String ... columns){
        for (String column:columns){
            OrderFieldDto dto = new OrderFieldDto();
            dto.setFieldName(column);
            dto.setOrderType("ASC");
            this.orderFields.add(dto);
        }
        return this;
    }

    public QueryWrapper orderByDesc(String ... columns){
        for (String column:columns){
            OrderFieldDto dto = new OrderFieldDto();
            dto.setFieldName(column);
            dto.setOrderType("DESC");
            this.orderFields.add(dto);
        }
        return this;
    }
}
